
/**
 * 如果把 array 从window传入frame中, 那么如何判断该变量是不是数组呢 ?
 * IE9+ 及 现代浏览器支持Array.isArray(array).
 */
function isArray(value) {
     if(Array.isArray) {
          return Array.isArray(value);
     } else {
          return Object.prototype.toString.call(value) == '[object Array]';
     }
}

/**
 * 如果参数非法, 则返回-1, 否则返回删除后的数组长度
 * @param array
 * @param index 如果同时指定了index和value, 则以index为准. 
 * @param value 如果index为空, 则删除匹配到的第一个value元素(从低下标向高下表). value可以为null或undefined
 * @returns {Number}
 */
function arrayRemove(array, index, value) {
	if(!isArray(array) || (index != null && (isNaN(index) || index < 0 || index > array.length))) {
		return -1;
	}
	// 根据value定位index
	if(index == null) {
		for(var i in array) {
			if(array[i] == value) {
				index = i;
			}
		}
	}
	if(index == null) {
		return -1;
	}
	// 根据index删除元素
	for(var i=0, n=0; i < array.length; i++) {
		if(array[i] != array[index]) {
			array[n++] = array[i];
		}
	}
	return array.length-=1;
	// 由于js传递的是对象的地址副本, 所以不能使用这种方式
	//	array = array.slice(0, index).concat(array.slice(index + 1, array.length));
	//	return array.length;
}

/**
 * IE(IE7 IE8)中以COM对象形式实现的任何函数, 调用 isFunction(value) 都将返回 false.
 */
function isFunction(value) {
      return Object.prototype.toString.call(value) == '[object Function]';
}

function isRegExp(value) {
      return Object.prototype.toString.call(value) == '[object RegExp]';
}

function isNativeJSON() {
     return window.JSON && Object.prototype.toString.call(JSON) == '[object JSON]';
}

function isWindow(obj) {
	/* jshint eqeqeq: false */
	return obj != null && obj == obj.window;
}

function isNumeric(obj) {
	return !isNaN(parseFloat(obj)) && isFinite(obj);
}

function isString(obj) {
	return typeof obj == 'string';
}




